<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]> <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]-->
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <title>docker  &middot; sitename</title>
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="HandheldFriendly" content="True">
<meta name="MobileOptimized" content="320">
<meta name="viewport" content="width=device-width, initial-scale=1">


<meta name="description" content="docker description" />

<meta name="keywords" content="three, four, ">


<meta property="og:title" content="docker  &middot; sitename ">
<meta property="og:site_name" content="sitename"/>
<meta property="og:url" content="https://lvzongcheng.gitee.io/tools/docker/" />
<meta property="og:locale" content="en-EN">


<meta property="og:type" content="article" />
<meta property="og:description" content="docker description"/>
<meta property="og:article:published_time" content="2017-12-14T00:00:00Z" />
<meta property="og:article:modified_time" content="2017-12-14T00:00:00Z" />

  
    
<meta property="og:article:tag" content="three">
    
<meta property="og:article:tag" content="four">
    
  

  

<script type="application/ld+json">
  {
    "@context": "http://schema.org",
    "@type": "Article",
    "headline": "docker",
    "author": {
      "@type": "Person",
      "name": "LvZongCheng"
    },
    "datePublished": "2017-12-14",
    "description": "docker description",
    "wordCount":  807 
  }
</script>



<link rel="canonical" href="https://lvzongcheng.gitee.io/tools/docker/" />

<link rel="apple-touch-icon-precomposed" sizes="144x144" href="https://lvzongcheng.gitee.io/touch-icon-144-precomposed.png">
<link href="https://lvzongcheng.gitee.io/favicon.png" rel="icon">

<meta name="generator" content="Hugo 0.60.0" />

  <!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->

<link href='https://fonts.googleapis.com/css?family=Merriweather:300%7CRaleway%7COpen+Sans' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="/css/font-awesome.min.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/highlight/default.css">

  
  
	<script>
	  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
	  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
	  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
	  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

	  ga('create', 'Your Google Analytics tracking code', 'auto');
	  ga('send', 'pageview');

	</script>

</head>
<body>
  <main id="main-wrapper" class="container main_wrapper has-sidebar">
    <header id="main-header" class="container main_header">
  <div class="container brand">
  <div class="container title h1-like">
  <a class="baselink" href="https://lvzongcheng.gitee.io">
  LvZongCheng

</a>

</div>

  
<div class="container topline">
  
  淡定 执著 进取 自律


</div>


</div>

  <nav class="container nav primary no-print">
  

<a class="homelink" href="https://lvzongcheng.gitee.io">home</a>


  
<a href="https://lvzongcheng.gitee.io/framework" title="Show list of Frameworks">Frameworks</a>

<a href="https://lvzongcheng.gitee.io/java" title="Show list of Java">Java</a>

<a href="https://lvzongcheng.gitee.io/linux" title="Show list of Linux">Linux</a>

<a href="https://lvzongcheng.gitee.io/redis" title="Show list of Redis">Redis</a>

<a href="https://lvzongcheng.gitee.io/sql" title="Show list of SQL">SQL</a>

<a href="https://lvzongcheng.gitee.io/Spring" title="Show list of Spring">Spring</a>

<a href="https://lvzongcheng.gitee.io/tools" title="Show list of Tools">Tools</a>

<a href="https://lvzongcheng.gitee.io/webpage" title="Show list of WebPage">WebPage</a>

<a href="https://lvzongcheng.gitee.io/information" title="Show list of information">information</a>

<a href="https://lvzongcheng.gitee.io/network" title="Show list of network">network</a>

<a href="https://lvzongcheng.gitee.io/%E5%BE%AE%E6%9C%8D%E5%8A%A1" title="Show list of 微服务">微服务</a>

<a href="https://lvzongcheng.gitee.io/%E6%80%BB%E7%BB%93" title="Show list of 总结">总结</a>

<a href="https://lvzongcheng.gitee.io/%E6%9C%BA%E5%99%A8%E8%87%AA%E5%8A%A8%E5%8C%96" title="Show list of 机器自动化">机器自动化</a>

<a href="https://lvzongcheng.gitee.io/%E6%B1%87%E7%BC%96" title="Show list of 汇编">汇编</a>

<a href="https://lvzongcheng.gitee.io/%E8%AE%B0%E4%BA%8B%E6%9C%AC" title="Show list of 记事本">记事本</a>


</nav>

<div class="container nav secondary no-print">
  
<a id="contact-link-email" class="contact_link" rel="me" aria-label="Email" href="mailto:Lyc19880405@163.com">
  <span class="fa fa-envelope-square"></span></a>



<a id="contact-link-github" class="contact_link" rel="me" aria-label="Github" href="https://github.com/enten/hugo-boilerplate">
  <span class="fa fa-github-square"></span></a>




 


















</div>


  

</header>


<article id="main-content" class="container main_content single">
  <header class="container hat">
  <h1>docker
</h1>

</header>

  <div class="container content">
  <h2 id="docker">Docker</h2>
<h3 id="docker-">docker 常用命令</h3>
<h4 id="heading">简介</h4>
<p>docker start 启动docker 进程
docker images  列出本地镜像
docker run  创建一个新的容器并运行一个命令
docker ps 查看启动的容器
docker ps -a  查看启动容器历史
docker start cet 启动容器
docker attach conTAINER ID 进入容器</p>
<p>docker rm $(docker ps -a -q) 删除有容器</p>
<p>docker stop $(docker ps -a | grep &ldquo;Exited&rdquo; | awk &lsquo;{print $1 }')  //停止容器
docker rm $(docker ps -a | grep &ldquo;Exited&rdquo; | awk &lsquo;{print $1 }')  //删除容器
docker rmi $(docker images | grep &ldquo;none&rdquo; | awk &lsquo;{print $3}')  //删除none镜像</p>
<h4 id="heading1">详细</h4>
<pre><code>    示例：
    使用方法：
适用范围：
优点：
缺点：
</code></pre>
<p>参数介绍：</p>
<h5 id="heading2">根据镜像创建容器</h5>
<ol>
<li>
<p>docker run
示例：docker run &ndash;name ubuntu -it ubuntu:14.04
使用方法：docker run 
适用范围：docker宿主机内部登录容器
优点：快捷方便
缺点：外部终端无法使用这种方法登录容器，exit后直接退出该容器，容器关闭。
参数介绍：
-i, &ndash;interactive               Keep STDIN open even if not attached ————交互 
-t, &ndash;tty                        Allocate a pseudo-TTY————分配伪终端
一般情况会使用-it这个组合命令，如果单用也只能单独使用-i命令 
-i 参数不会产生伪终端，但是会有正确的返回</p>
</li>
<li>
<p>docker attach 进入容器
使用方法：docker attach  [container name]
适用范围：docker宿主机内部登录容器 
优点：快捷方便
缺点：1. exit后直接退出该容器，容器关闭。
2. 多屏同步 这相当于同一时间最多只能有一个终端连接容器。
参数介绍：</p>
</li>
<li>
<p>docker exec
示例：docker exec -it ubuntu /bin/bash
使用方法：
适用范围：
优点：exit退出该容器后容器不会关闭
缺点：
参数介绍：</p>
</li>
</ol>
<h3 id="docker--">Docker  安装</h3>
<h4 id="centos-docker-">CentOS Docker 安装</h4>
<p>Docker支持以下的CentOS版本：
CentOS 7 (64-bit)<br>
CentOS 6.5 (64-bit) 或更高的版本</p>
<h6 id="yum-">yum 安装</h6>
<p>Docker 要求 CentOS 系统的内核版本高于 3.10 ，查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本</p>
<pre><code class="language-linux" data-lang="linux"># uname -r 3.10.0-327.el7.x86_64
#yum -y install docker
//启动 Docker 后台服务
# service docker start
//测试运行 hello-world
#docker run hello-world
</code></pre><h3 id="docker1">Docker</h3>
<h6 id="1">1.镜像</h6>
<pre><code>     Docker运行容器前需要本地存在对应的镜像。  
     镜像可以用来创建Docker容器的。一个镜像可以包含一个完整的操作系统环境和用户需要的其它应用程序。在docker hub  里面有大量现成的镜像提供下载。docker的镜像是只可读的，一个镜像可以创建多个容器。  
</code></pre>
<h6 id="2">2.容器</h6>
<pre><code>      docker利用容器来开发、运行应用。
     容器是镜像创建的实例。它可以被启动、开始、停止、删除。每个容器都是 相互隔离的、保证安全的平台。
</code></pre>
<h6 id="3">3.仓库</h6>
<pre><code>     仓库是集中存放镜像文件的场所。
     每个 仓库中又包含了多个镜像，每个镜像有不同的标签（tag）。
     最大的公开仓库是DockerHub，存放了数量庞大的镜像供用户下载。国内的公开 仓库包括DockerPool等，可以提供大陆用户更稳定快速的访问。当然，用户也可以在本地网络内创建一个私有仓库。
</code></pre>
<h6 id="-docker">使用脚本安装 Docker</h6>
<p>1、  使用 sudo 或 root 权限登录 Centos。
2、确保 yum 包更新到最新。
$ sudo yum update
3、  执行 Docker 安装脚本。
$ curl -fsSL <a href="https://get.docker.com/">https://get.docker.com/</a> | sh
执行这个脚本会添加 docker.repo 源并安装 Docker。
4、  启动 Docker 进程。
$ sudo service docker start
5、  验证 docker 是否安装成功并在容器中执行一个测试的镜像。
$ sudo docker run hello-world<br>
到此，docker 在 CentOS 系统的安装完成。</p>
<h3 id="heading3">在容器中安装新程序</h3>
<p>docker run -it &ndash;rm ubuntu:14.04 bash</p>
<p>docker run  就是运行容器的命令，具体格式我们会在后面的章节讲解，我们这
里简要的说明一下上面用到的参数。<br>
-it  ：这是两个参数，一个是  -i  ：交互式操作，一个是  -t  终端。我们
这里打算进入  bash  执行一些命令并查看返回结果，因此我们需要交互式终
获取镜像
51
端。
&ndash;rm  ：这个参数是说容器退出后随之将其删除。默认情况下，为了排障需
求，退出的容器并不会立即删除，除非手动  docker rm  。我们这里只是随便
执行个命令，看看结果，不需要排障和保留结果，因此使用  &ndash;rm  可以避免
浪费空间。
ubuntu:14.04  ：这是指用  ubuntu:14.04  镜像为基础来启动容器。
bash  ：放在镜像名后的是命令，这里我们希望有个交互式 Shell，因此用的
是  bash  。</p>
<h3 id="heading4">下载安装镜像</h3>
<h3 id="heading5">发布自己镜像</h3>
<p><a href="http://www.runoob.com/docker/docker-run-command.html">http://www.runoob.com/docker/docker-run-command.html</a></p>
<hr>
<h5 id="heading6">镜像</h5>
<h6 id="11">1.获取镜像</h6>
<pre><code>docker pull dl.dockerpool.com:5000/ubuntu:14.04(dl.dockerpool.com为注册服务器，5000为端口号，ubuntu为仓库名称，14.04是镜像也是版本号)
</code></pre>
<h6 id="21">2.查看镜像信息</h6>
<pre><code>docker images(列出本地主机已有的所有镜像)
更改变迁信息
docker
 tag dl.dockerpool.com:5000/ubuntu:latest ubuntu:latest
docker inspect 000（000为镜像ID，显示这个镜像的详细信息）
</code></pre>
<h6 id="31">3.搜寻镜像</h6>
<pre><code>docker search mysql （输出信息包括镜像名字、描述、星级、是否为官方创建、是否自动创建）
</code></pre>
<h6 id="4">4.删除镜像</h6>
<pre><code>docker rmi dl.dockerpool.com:5000/ubuntu:latest
注：当有该镜像创建的容器存在时，镜像文件默认是无法删除的，所以删除镜像前最好是删除所有依赖该镜像的容器，请不要用强制删除。
</code></pre>
<h6 id="5">5.创建镜像</h6>
<pre><code>有三种方法：

    a. 基于已有镜像的容器创建

        docker commit -m “add new image”-a &quot;&quot; 000(容器ID) test（新建image name）

    b. 基于本地模板导入

        cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04

    c. 基于dockerfile创建
</code></pre>
<h6 id="6">6.存储镜像</h6>
<pre><code>docker save -o ubuntu_14.04.tar ubuntu:14.04
</code></pre>
<h6 id="7">7.载入镜像</h6>
<p>docker load &ndash;input ubuntu_14.04.tar 或者</p>
<p>docker load &lt; ubuntu_14.04.tar</p>
<h6 id="8">8.上传镜像</h6>
<pre><code>docker push user/test:latest(user用户需要在dockerHub网站注册)
</code></pre>
<h4 id="heading7">容器</h4>
<p>容器是镜像的一个运行实例，但它带有额外的可写层</p>
<h6 id="12">1.创建容器</h6>
<pre><code>docker create -it ubuntu:12.04
</code></pre>
<h6 id="22">2.创建并启动容器</h6>
<pre><code>docker run -it ubuntu:12.04 /bin/bash
</code></pre>
<h6 id="32">3.守护态运行</h6>
<pre><code>docker run -d ubuntu:12.04
</code></pre>
<h6 id="41">4.查看容器信息</h6>
<pre><code>docker ps [-a -q 查看终止状态]
</code></pre>
<h6 id="51">5.获取容器的输出信息</h6>
<pre><code>docker logs cet(cet是容器ID前三个字符)
</code></pre>
<h6 id="61">6.终止容器</h6>
<pre><code>docker stop cet
</code></pre>
<h6 id="71">7.启动容器</h6>
<pre><code>docker start cet
</code></pre>
<h6 id="81">8.重启容器</h6>
<pre><code>docker restart cet
</code></pre>
<h6 id="9">9.进入容器</h6>
<pre><code>1) attach命令

    docker attach nostalgic(nostalgic是docker的name)

    缺点：所有窗口同步显示

2) exec命令

    docker exec -it 243... /bin/bash (243...为docker ID)

3) nsenter命令

    a）找PID

        PID=$(docker-pid 243..)

    b）通过PID链接容器

        nsenter --target $PID --mount --uts --ipc --net --pid
</code></pre>
<h6 id="10">10.删除容器</h6>
<pre><code>docker rm [-f -l -v] cet

    -f 强行终止并删除

    -l 删除容器的链接，保留容器

    -v 删除挂载的数据卷
</code></pre>
<h6 id="111">11.导出容器</h6>
<pre><code>docker export cet &gt;test.tar
</code></pre>
<h6 id="121">12.导入容器（将容器快照导入到本地镜像库）</h6>
<pre><code>cat test.tar | docker import - test/ubuntu:v1.0（重新指定标签为ubuntu的镜像名称，v1.0的版本号
</code></pre>
<p>docker load 也可以导入镜像存储文件到本地镜像库，他比import方式的好处是：import导入镜像快照文件将丢失所有的历史记录和元数据信息。</p>
<p>**注：**通过导出容器和导入容器可以实现容器迁移（拷贝文件）</p>
<hr>
<h4 id="heading8">仓库</h4>
<p>仓库是集中存放镜像的地方，一个注册服务器上有很多仓库，一个仓库中有很多镜像。</p>
<h6 id="1-">1. 登录</h6>
<pre><code>docker login
</code></pre>
<h6 id="2-">2. 基本操作</h6>
<pre><code>查找、上传、下载
</code></pre>
<h6 id="3-">3. 自动创建</h6>
<h6 id="4-">4. 查看镜像</h6>
<pre><code>http://www.dockerpool.com/downloads
</code></pre>
<h6 id="5-">5. 更新镜像标签</h6>
<pre><code>docker tag dl.dockerpool.com:5000/ubuntu:12.04 ubuntu:12.04(将前面的镜像更改为ubuntu:12.04)
</code></pre>
<h6 id="6-">6. 创建私有仓库</h6>
<pre><code>docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry
registry(自动下载并启动registry容器，创建本地的私有仓库服务,默认仓库船舰的容器在/tmp/registry，可以通过-v参数来存放到指定路径上)
</code></pre>
<h6 id="72">7.管理私有仓库镜像</h6>
<pre><code>假设私有仓库地址为10.0.2.2，端口为5000，

docker tag ubuntu:14.04 10.0.2.2:5000/test(更改标签名)

docker push 10.0.2.2:5000/test(push镜像，会自动push到10.0.2.2地址的机器上)

curl http://10.0.2.2:5000/v1/search(查看仓库10.0.2.2:5000中是否含有test镜像)

docker pull 10.0.2.2:5000/test(在任何一台能访问到10.0.2.2地址的机器上下载镜像)
	
    -----------
</code></pre>
<h4 id="heading9">自己制作镜像</h4>
<p>在使用Docker的过程中，我们除了从Docker Hub上下载已经做好的镜像，很多时候需要我们自己制作镜像。下面想在这个文章中说明一下镜像的制作方法。</p>
<h6 id="heading10">制作镜像的方式主要有两种：</h6>
<ul>
<li>通过docker commit 制作镜像</li>
<li>通过docker build 制作镜像
这两种方式都是通过改进已有的镜像来达到自己的目的。制作基础镜像，会在另外一篇文章“从零开始制作基础镜像”中介绍。
docker commit</li>
</ul>
<p>docker commit 是往版本控制系统里提交一次变更。使用这种方式制作镜像，本质上是运行一个基础镜像，然后在基础镜像上进行软件安装和修改。最后再将改动提交到版本系统中。</p>
<p>选择基础镜像</p>
<p>基础镜像的选择要结合自己的需求。可以选择已有的应用镜像来改造，也可以选择Ubuntu，Debian，OpenSuse这类基础系统镜像</p>
<p>我们以ubuntu为例子来说明</p>
<p>步骤1：运行ubuntu 镜像</p>
<p>docker run -i -t ubuntu /bin/bash</p>
<p>步骤2：安装软件并修改软件配置, 比如：安装apache2</p>
<p>apt-get -yqq update</p>
<p>apt-get -y install apache2</p>
<p>安装完成后，对apache2进行配置和修改</p>
<p>步骤3：退出docker并保存镜像</p>
<p>使用“exit”命令退出容器</p>
<p>运行docker comit 命令, 进行保存</p>
<p>docker commit 61412230ae46 own-apache2</p>
<p>docker commit 命令参数说明</p>
<p>命令格式</p>
<p>docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]</p>
<p>OPTIONS:</p>
<p>-a, &ndash;author=        提交的镜像作者</p>
<p>-c, &ndash;change=[]    Apply Dockerfile instruction to the created image, 没用过</p>
<p>-m, &ndash;message=   提交时的说明文字</p>
<p>-p, &ndash;pause=true  在commit时，将container 暂停</p>
<p>CONTAINER:</p>
<p>可以使用container 的名字或者ID</p>
<p>REPOSITORY</p>
<p>指定镜像仓库，上述例子中，指定的是本地存储</p>
<p>可以指定远程镜像仓库，如docker hub。也可自建仓库来存放image</p>
<p>TAG:</p>
<p>镜像TAG</p>
<p>docker build</p>
<p>使用docker build创建镜像需要编写Dockerfile.</p>
<p>步骤：</p>
<p>编写自己的Dcokerfile</p>
<p>运行docker build 命令打包镜像</p>
<p>仍然以apache打包为例子。以下是Dockerfile的例子</p>
<p>FROM ubuntu:latest</p>
<p>MAINTAINER sky</p>
<p>#Add 163 mirror for apt</p>
<p>ADD sources.list /etc/apt/sources.listADD .bashrc /root/.bashrcENV DEBIAN_FRONTEND noninteractive# PackagesRUN rm -rf /var/lib/apt/listsRUN apt-get update -q &ndash;fix-missingRUN apt-get -y upgrade#ubuntu wwwRUN apt-get install -y apache2 curl libapache2-mod-php5 php5-curl php5-gd php5-mysql rsync mysql-client -qqRUN apt-get autocleanRUN rm -rf /var/lib/apt/lists/<em># Setup environmnt for apache's init scriptENV APACHE_CONFDIR /etc/apache2ENV APACHE_ENVVARS $APACHE_CONFDIR/envvarsENV APACHE_RUN_USER www-dataENV APACHE_RUN_GROUP www-dataENV APACHE_RUN_DIR /var/run/apache2ENV APACHE_PID_FILE $APACHE_RUN_DIR/apache2.pidENV APACHE_LOCK_DIR /var/lock/apache2ENV APACHE_LOG_DIR /var/log/apache2ENV LANG CRUN mkdir -p $APACHE_RUN_DIR $APACHE_LOCK_DIR $APACHE_LOG_DIRRUN find &ldquo;$APACHE_CONFDIR&rdquo; -type f -exec sed -ri ' \        s!^(\s</em>CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \        s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; ' &lsquo;{}&rsquo; &lsquo;;&lsquo;EXPOSE 80CMD [&ldquo;apache2&rdquo;, &ldquo;-DFOREGROUND&rdquo;]</p>
<p>编辑完成后，在与Dockerfile同一目录下运行docker build 命令</p>
<p>docker build -t apache-img .</p>
<p>如果没有命令出错，docker build会持续运行直到镜像创建完成</p>
<p>而创建的过程本质上是运行一个镜像，然后在镜像中按序执行在Dockerfile中的命令，直到执行结束。</p>
<p>如果中间有命令执行失败，镜像创建会停止。这时就需要看log，并修改Dockerfile，然后再次执行docker build</p>
<p>注：两种镜像创建方式的对比：</p>
<p>docker commit</p>
<p>docker build</p>
<p>难度相对容易，适合新手和对Linux不熟悉的用户相对难，要求有一定的linux和脚本基础知识</p>
<p>文档化</p>
<p>文档化在通过其他文件来实现</p>
<p>Dockerfile本身就是比较好的文档，可读和可理解性比较强。也可配合其他文档带来详细说明</p>
<p>升级，维护</p>
<p>后续升级和维护麻烦，需要再次运行镜像并对内部软件进行升级或者安装新软件增加特性</p>
<p>后续升级和维护会相对简单，可以直接在dockerfile中更改并增加新特性</p>
<p>具体选择哪种方式来制作镜像需要结合实际情况来选择</p>
<p>Dockerfile 关键字详解</p>
<p>FROM</p>
<p>FROM用来指定基础包。在上面的例子中，基础包用的是ubuntu。</p>
<p>MAINTAINER</p>
<p>镜像作者信息，或者维护人员信息</p>
<p>ADD</p>
<p>将文件拷贝到Container内文件系统对应的路径</p>
<p>格式 ADD <!-- raw HTML omitted --> <!-- raw HTML omitted --></p>
<p>所有拷贝到Container中的文件和文件夹权限为0755，uid和gid为0</p>
<p>如果需要修改owner用户或者权限，需要使用RUN进行修改</p>
<p>ADD文件，文件路径要在docker build<!-- raw HTML omitted -->中指定的<!-- raw HTML omitted -->下</p>
<p>RUN</p>
<p>创建镜像时执行</p>
<p>ENV</p>
<p>用来设置环境变量</p>
<p>EXPOSE</p>
<p>Container内部服务开启的端口</p>
<p>主机上如果要使用，还需要在启动Container时，做host-container的商品映射</p>
<p>使用EXPOSE后，一些自动化布署工具可以直接读取这个信息，自动进行端口映射</p>
<p>EXPOSE可以有多条，指定多个端口</p>
<p>WORKDIR</p>
<p>切换工作目录，可进行多次切换（相当于cd命令）</p>
<p>切换目录对RUN，CMD，ENTRYPOINT有效</p>
<p>USER</p>
<p>执行container的用户，如未指定，则默认使用root用户</p>
<p>ENTRYPOINT</p>
<p>Container启动时执行的命令，一个Dockerfile中只能有一条ENTRYPOINT</p>
<p>ENTRYPOINT没有CMD的可替换特性</p>
<p>CMD</p>
<p>Container 启动时执行的命令，一个Dockerfile 中只能有一条CMD命令，如果有多条则只执行最后一条CMD</p>
<p>如果有多条命令希望在启动后执行，可以考虑使用shell 脚本</p>
<p>与ENTRYPOINT的区别</p>
<p>CMD的主要用途是为可执行的container提供默认命令</p>
<p>CMD在运行时是可替换的，比如</p>
<p>在ubuntu中，CMD指定的是/bin/bash。默认情况下运行ubuntu，container中的/bin/bash会被执行</p>
<p>如果使用docker run指定运行命令，那CMD会被替换掉</p>
<p>如：docker run ubuntu /bin/echo &ldquo;this is a echo&rdquo;. 这时，container 启动后会执行echo 而不是/bin/bash了</p>
<p>ENTRYPOINT是不会替换的，如果在ubuntu镜像中加入ENTRYPOINT，那ENTRYPOINT在启动后会先被执行</p>
<p>CMD可以为ENTRYPOINT来提供参数</p>
<p>例子：</p>
<p>FROM ubuntu:14.10</p>
<p>ENTRYPOINT [&ldquo;top&rdquo;, &ldquo;-b&rdquo;]</p>
<p>CMD [&quot;-c&rdquo;]</p>
<p>VOLUME</p>
<p>语法：VOLUME [PATH]</p>
<p>VOLUME指令用来设置一个挂载点，可以用来让其他容器挂载以实现数据共享或对容器数据的备份、恢复或迁移</p>
<p>可以将本地文件夹或者其他Container的文件夹挂载到Container中</p>

</div>


  
</article>
      <footer id="main-footer" class="container main_footer">
  

  <div class="container nav foot no-print">
  
<a href="https://lvzongcheng.gitee.io/license">license</a>


  <a class="toplink" href="#">back to top</a>

</div>

  <div class="container credits">
  
<div class="container footline">
  
  code with <!-- raw HTML omitted --><!-- raw HTML omitted -->


</div>


  
<div class="container copyright">
  
  (c) 2015 yourname.


</div>


</div>

</footer>

    </main>
    
<script type="text/javascript">
  (function() {
    
    
    if (window.location.hostname == "localhost")
      return;
    var dsq = document.createElement('script'); dsq.async = true; dsq.type = 'text/javascript';
    dsq.src = '//your_disqus_shortname.disqus.com/count.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
  })();
</script>



<script src="/js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>



    
  </body>
</html>

